import { app, protocol, BrowserWindow } from 'electron'
import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
import { ShellConfig } from '@/config'
import { createWindow, windowMap } from './window'
import { initIpcMain } from './ipc-main'
import path from 'path';

// 初始化变量和模块
const isDevelopment = process.env.NODE_ENV !== 'production'
initIpcMain();

// 先注册一个app协议用来加载文档，用作于打包后的文档载入，其实就是类似于file://协议加载本地文件
protocol.registerSchemesAsPrivileged([
  { scheme: 'app', privileges: { secure: true, standard: true } }
])

/**
 * @description 创建主窗口
 */
function createMainWindow() {
  let mainPath = '';
  if (isDevelopment) {
    // 本地开发访问路径
    mainPath = ShellConfig.devAppPath;
  } else {
    // 生产环境访问的路径
    mainPath = ShellConfig.prodAppPath;
  }

  // 创建窗口
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  createWindow({
    width: 800,
    height: 600,
    tag: "main",
    frame: ShellConfig.isNoFrame ? false : true,
  }, mainPath);

}


// 当应用激活时，如果没有窗口，创建主窗口
app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) createMainWindow()
})

// 当electron结束初始化时创建主窗口。
app.on('ready', async () => {
  // 开发状态并且不是测试模式时，安装Vue Devtools工具
  if (isDevelopment && !process.env.IS_TEST && process.platform!== 'linux') {
    // Install Vue Devtools
    try {
      await installExtension(VUEJS_DEVTOOLS)
    } catch (e: any) {
      console.error('Vue Devtools failed to install:', e.toString())
    }
  }
  createMainWindow()
})

// 当所有窗口关闭时，关闭应用
app.on('window-all-closed', () => {
  // 在mac系统上，通常除非使用Cmd+Q明确退出，否则不关闭应用。
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

// 第二个实例启动时激活主实例窗口
if (ShellConfig.forbidMultiOpen) {
  const gotTheLock = app.requestSingleInstanceLock();
  if (!gotTheLock) {
    app.exit();
  } else {
    app.on('second-instance', () => {
      // 当运行第二个实例时,将会聚焦到主窗口
      const mainID : any = windowMap.get("main");
      const win: any = BrowserWindow.fromId(mainID);    
      if (win) {
        if (win.isMinimized()) win.restore();
        win.focus();
      }
    })
  }
}

// 在开发模式下，根据父进程的请求干净地退出。
if (isDevelopment) {
  if (process.platform === 'win32') {
    process.on('message', (data) => {
      if (data === 'graceful-exit') {
        app.quit()
      }
    })
  } else {
    process.on('SIGTERM', () => {
      app.quit()
    })
  }
}
